package com.dss.auto_deploy.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.*;
import java.time.LocalTime;
import java.util.Base64;
import java.util.Date;


/**
 * @Description:
 * @author: dongshoushan
 * @date: 2023年05月17日 16:57
 */
public class Test2 {
    public static void main(String[] args) {
        //test0();

        //List<String> names = Arrays.asList("提测说明","提测DR","回归BUG","遗留BUG","产品文档");
        //for (String name : names) {
        //    test1(name);
        //}
        //test2();
        //test3();
        //testBase64();
        //根据字符串，生成普通二维码
        qrTest1();
        //根据字符串，生成带logo、底部文字二维码
        qrTest2();
        //根据字符串，生成带logo、底部文字二维码
        qrTest3();
    }

    private static void qrTest3() {
        String qrCodeText = "https://www.baidu.com/";
        String filePath = "D:\\temp\\二维码test4.png";
        String logoFilePath = "D:\\图片\\嫦娥.png";
        String bottomText = "不良帅dss";
        try {
            QRCodeGenerator.generateQRCodeWithLogoAndText(qrCodeText, filePath, logoFilePath, bottomText,0.15f);
            System.out.println("生成带logo的二维码成功 "+filePath);
        }catch (Exception e) {
            e.printStackTrace();
        }
        // 解析二维码图片内容
        String decodedContent = QrCodeUtil.decode(FileUtil.file(filePath));
        if (StrUtil.isNotBlank(decodedContent)) {
            System.out.println("二维码内容："+decodedContent);
        } else {
            System.out.println("未能从二维码图片中解析出有效内容");
        }
    }


    private static void qrTest2() {
        String qrCodeText = "https://tongyi.aliyun.com/qianwen/";
        String filePath = "D:\\temp\\二维码test2.png";
        String logoFilePath = "D:\\图片\\提测单logo.png";
        String bottomText = "cnbu";
        try {
            QRCodeGenerator.generateQRCodeWithLogoAndText(qrCodeText, filePath, logoFilePath, bottomText,0.25f);
            System.out.println("生成带logo的二维码成功 "+filePath);
        }catch (Exception e) {
            e.printStackTrace();
        }
        // 解析二维码图片内容
        String decodedContent = QrCodeUtil.decode(FileUtil.file(filePath));
        if (StrUtil.isNotBlank(decodedContent)) {
            System.out.println("二维码内容："+decodedContent);
        } else {
            System.out.println("未能从二维码图片中解析出有效内容");
        }
    }
    /**
     * 生成普通二维码
     */
    private static void qrTest1() {
        String content = "https://www.baidu.com/";
        String qrCodeImagePath = "D:\\temp\\二维码test.png";

        // 生成二维码并保存到指定路径
        try {
            QrCodeUtil.generate(content, 300, 300, new File(qrCodeImagePath));
            System.out.println("二维码已成功生成并保存至：" + qrCodeImagePath);
        }catch (Exception e) {
            System.out.println("二维码生成失败");
        }
        // 解析二维码图片内容
        String decodedContent = QrCodeUtil.decode(FileUtil.file(qrCodeImagePath));
        if (StrUtil.isNotBlank(decodedContent)) {
            System.out.println("二维码内容："+decodedContent);
        } else {
            System.out.println("未能从二维码图片中解析出有效内容");
        }
    }


    /**
     * 测试将图片文件转换为 Base64 编码字符串。
     * 该方法不接受任何参数，也不返回任何值。
     * 它仅读取指定路径的图片文件，并将该图片文件的内容转换为 Base64 编码后输出到控制台。
     */
    private static void testBase64() {
        String imagePath = "D:\\图片\\头像.jpg"; // 指定图片文件的路径

        try {
            // 读取图片文件内容
            File file = new File(imagePath);
            FileInputStream fis = new FileInputStream(file);
            byte[] data = new byte[(int) file.length()]; // 根据文件长度创建字节数组
            fis.read(data); // 读取文件内容到字节数组
            fis.close(); // 关闭文件输入流

            // 将图片字节数组转换为 Base64 编码字符串
            String base64Image = Base64.getEncoder().encodeToString(data);

            // 输出 Base64 编码字符串至控制台
            System.out.println(base64Image);
        } catch (IOException e) {
            // 捕获并打印可能发生的 IOException
            e.printStackTrace();
        }
    }


    // 这段代码用于监听指定的目录，当目录下的文件发生变化时，触发增量编译操作。下面是加上中文注释后的代码：
    private static void test3() {
        // 需要监听的目录
        Path dir = Paths.get("path/to/module");

        // 创建一个 WatchService 对象，用于监听目录
        try {
            WatchService watcher = FileSystems.getDefault().newWatchService();
            // 注册目录和事件类型
            dir.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);

            // 开始监听目录
            while (true) {
                // 等待一个事件
                WatchKey key;
                try {
                    key = watcher.take();
                } catch (InterruptedException e) {
                    break;
                }

                // 处理事件
                for (WatchEvent<?> event : key.pollEvents()) {
                    // 事件类型
                    WatchEvent.Kind<?> kind = event.kind();
                    if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                        // 文件发生变化，触发增量编译操作
                        // 调用 Maven 命令进行增量编译
                        Runtime.getRuntime().exec("mvn clean install -pl :your-module-name");
                    }
                }

                // 重置键，准备监听下一个事件
                boolean valid = key.reset();
                if (!valid) {
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void test2() {
        String bmcIp = "192.168.1.120";
        String prefix = bmcIp.substring(0,bmcIp.lastIndexOf("."));
        System.out.println(prefix);
    }


    private static void test1(String text) {
        try {
            // 发送邮件，将合并后的图片作为附件添加到邮件中
            String originalImagePath = "D:\\workspace\\auto-test-platform\\lenovo-modules\\lenovo-test\\src\\main\\resources\\img\\testingSheet\\emailItem.jpg";
            String outputImagePath = "D:\\workspace\\auto-test-platform\\lenovo-modules\\lenovo-test\\src\\main\\resources\\img\\testingSheet\\"+text + ".jpg";
            // 加载原始图片
            BufferedImage originalImage = ImageIO.read(new File(originalImagePath));
            // 创建一个 BufferedImage 对象作为合并后的图像，并设置背景为原始图片的背景色
            BufferedImage combinedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
            Graphics2D g = combinedImage.createGraphics();
            // 设置背景色为原始图片的背景色
            g.setColor(new Color(originalImage.getRGB(0, 0)));
            g.fillRect(0, 0, combinedImage.getWidth(), combinedImage.getHeight());
            // 在合并的图像上绘制原始图像
            g.drawImage(originalImage, 0, 0, null);
            // 设置文本样式
            Font font = new Font("微软雅黑", Font.BOLD, 20);
            g.setFont(font);
            g.setColor(Color.WHITE);
            // 设置文本位置
            int x= 58; // 文本左上角的 x 坐标
            int y = 24; //本左上角的 y 坐标
            g.drawString(text, x, y);
            // 保存合并后的图像为新文件
            ImageIO.write(combinedImage, "jpg", new File(outputImagePath));
            // 清理资源
            g.dispose();
            System.out.println(text + "====== 合成完毕！");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void test0() {
        String s = "用例编号\t原编号\t用例名称\t用例分组\t测试对象\t摘要\t前提\t步骤详情\t测试数据\t期望结果\t执行方式\t测试阶段\t测试类型\t状态\t重要性\t测试方式\t执行时间\t标签\t关联关系\t关联id\t附件\t可见度\t覆盖策略\t测试方法\t质量属性\t审批人\t发布时间\t创建人\t创建时间\t更新时间\t版本\n";
        String[] split = s.split("\t");
        for (int i = 0; i < split.length; i++) {
            System.out.println(i + "  " + split[i]);
        }
        Date date = DateUtils.addDays(new Date(), -1);
        System.out.println(DateUtils.getTime(date));
        LocalTime currentTime = LocalTime.now();
        long hours = currentTime.getHour();
        long mins = currentTime.getMinute();
        System.out.println(hours);
        System.out.println(mins);
    }


}
